package ve.lm.hrms_cy.Utils;


import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Jws;

import java.security.Key;
import java.util.Date;

@Component
public class JwtUtil {

    @Value("${jwt.secret}")
    private String secretKey;  // 从配置文件中读取的密钥

    @Value("${jwt.expiration}")
    private long expirationTime;  // 从配置文件中读取的 Token 有效期（毫秒）



    /**
     * 生成 JWT Token。
     * 包含用户 ID 和用户名。
     * @param userId 用户 ID
     * @param username 用户名
     * @return String 生成的 JWT Token
     */
    public String generateToken(Long userId, String username ,String permission) {
        System.out.println(secretKey+" " + System.currentTimeMillis() +" "+ expirationTime);

        return Jwts.builder()  // 创建 JWT 构建器
                .setSubject(String.valueOf(userId))  // 设置用户 ID 作为主题
                .claim("username", username).claim("permission",permission) // 添加用户名作为自定义 Claims
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))  // 设置 Token 过期时间
                .signWith(SignatureAlgorithm.HS256, secretKey.getBytes())  // 使用 HMAC-SHA256 签名
                .compact();  // 构建并压缩 Token
    }

    /**
     * 解析 JWT Token。
     * 提取 Token 的 Claims 部分。
     * @param token JWT Token
     * @return Claims 解析后的 Claims
     * @throws RuntimeException 如果 Token 无效或已过期
     */
    public Claims parseToken(String token) {
        try {
            return Jwts.parser()  // 创建 JWT 解析器
                    .setSigningKey(secretKey.getBytes())  // 设置签名密钥
                    .build()
                    .parseSignedClaims(token)  // 解析 Token
                    .getPayload();  // 提取 Claims 部分
        } catch (ExpiredJwtException e) {
            throw new RuntimeException("Token 已过期", e);  // 捕获 Token 过期异常
        } catch (SignatureException e) {
            throw new RuntimeException("无效的 JWT 签名", e);  // 捕获签名验证失败异常
        } catch (JwtException e) {
            throw new RuntimeException("无效的 JWT Token", e);  // 捕获其他 JWT 异常
        }
    }

    /**
     * 从 Token 中提取用户 ID。
     * @param token JWT Token
     * @return Long 用户 ID
     */
    public Long getUserIdFromToken(String token) {
        Claims claims = parseToken(token);  // 解析 Token
        return Long.valueOf(claims.getSubject());  // 提取用户 ID
    }

    /**
     * 从 Token 中提取用户名。
     * @param token JWT Token
     * @return String 用户名
     */
    public String getUserNameFromToken(String token) {
        Claims claims = parseToken(token);  // 解析 Token
        return claims.get("username", String.class);  // 提取用户名
    }


    public String getPermissionFromToken(String token) {
        Claims claims = parseToken(token);  // 解析 Token
        return claims.get("permission", String.class);  // 提取用户名
    }

    /**
     * 判断 Token 是否有效。
     * 校验 Token 的签名和有效期。
     * @param token JWT Token
     * @return boolean 是否有效
     */
    public boolean isTokenValid(String token) {
        try {
            // 使用新的解析方式
            Claims claims = Jwts.parser()
                    .verifyWith(Keys.hmacShaKeyFor(secretKey.getBytes())) // 设置签名密钥
                    .build()
                    .parseSignedClaims(token) // 解析已签名的 Claims
                    .getPayload(); // 获取 Claims

            // 获取过期时间
            Date expirationDate = claims.getExpiration();
            Date now = new Date();

            // 检查是否过期
            return expirationDate != null && expirationDate.after(now);
        } catch (JwtException e) {
            // 如果解析失败或过期，返回 false
            return false;
        }
    }
}